#ifndef __VTOR_MODBUS_H__
#define __VTOR_MODBUS_H__

#ifdef __cplusplus
extern "C" {
#endif

#include "vtor_elec_module_config.h"

#ifdef __VTOR_MODBUS__

#define VtorModbus_ReadReadWriteRegister	0x03
#define VtorModbus_ReadReadOnlyRegister		0x04
#define VtorModbus_WriteSingleRegister		0x06
#define VtorModbus_WriteMultipleRegister	0x10


#define VtorModbus_ReadWriteStartAddr		40001
#define VtorModbus_ReadWriteEndAddr			49999
	
#define VtorModbus_ReadOnlyStartAddr		30001
#define VtorModbus_ReadOnlyEndAddr			39999
	
typedef struct VtorModbusRegisterStruct
{
	uint16_t addr;
	uint16_t value;
}VtorModbusRegister;

extern uint8_t VtorModbus_id;
extern VtorModbusRegister* VtorModbus_registerArray;
extern uint8_t VtorModbus_txBuf[128];
extern uint8_t VtorModbus_txLen;


// modbus基本操作：校验，查找寄存器等
uint16_t VtorModbus_CalcCrc(uint8_t* buf, uint16_t dataLen);
void VtorModbus_AppendCrc(uint8_t* buf, uint16_t dataLen);
uint8_t VtorModbus_CheckCrc(uint8_t* buf, uint16_t totalLen);
VtorModbusRegister* VtorModbus_SearchAddress(uint16_t addr);

// modbusslave相关操作
uint16_t VtorModbusSlave_Process(uint8_t* rxBuf, uint16_t len);
uint8_t VtorModbusSlave_ReadReg(uint16_t regAddr, uint16_t* regBuf, uint16_t regNum);
uint8_t VtorModbusSlave_WriteReg(uint16_t regAddr, uint16_t* regBuf, uint16_t regNum);
uint8_t VtorModbusSlave_ReadFloat(uint16_t regAddr, float* floatBuf, uint16_t floatNum);
uint8_t VtorModbusSlave_WriteFloat(uint16_t regAddr, float* floatBuf, uint16_t floatNum);
void VtorModbusSlave_ProcessWriteCallback(uint16_t regAddr, uint16_t regNum);

// modbusmaster相关操作
uint16_t VtorModbusMaster_Process(uint8_t* rxBuf, uint16_t len);
uint8_t VtorModbusMaster_ReadReg(uint8_t slaveId, uint16_t regAddr, uint16_t* regBuf, uint16_t regNum);
uint8_t VtorModbusMaster_WriteReg(uint8_t slaveId, uint16_t regAddr, uint16_t* regBuf, uint16_t regNum);
void VtorModbusMaster_ProcessReadCallback(uint16_t regAddr, uint16_t regNum);

// 用户自行实现接口
void VtorModbus_Init(uint8_t id);
void VtorModbus_SendBuffer(uint8_t* buf, uint16_t len);
// 测试接口
void VtorModbusMaster_TestTask(void);
void VtorModbusSlave_TestTask(void);

#endif // __VTOR_MODBUS__

#ifdef __cplusplus
}
#endif

#endif

